#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
文件名称: analysis_format_config.py
完整路径: backend/config/analysis_format_config.py
功能说明: 分析格式化配置示例 - 说明动态配置不强制的设计理念
"""

# ==================== 配置层次结构说明 ====================

"""
配置层次结构（从静态到动态）：

1. 静态配置（硬编码，永远存在）
   - 默认值、基础配置
   - 系统必需的核心配置
   - 不依赖外部配置的兜底配置

2. 动态配置（可选，可以没有）
   - 从配置文件读取的配置
   - 从数据库读取的配置
   - 从环境变量读取的配置
   - 运行时动态生成的配置

3. 运行时配置（用户传入）
   - 用户自定义的配置选项
   - 临时覆盖的配置
   - 特定场景的配置

设计理念：动态配置不强制
- 即使没有动态配置文件，系统也能正常工作
- 动态配置只是增强功能，不是必需功能
- 提供合理的默认值作为兜底
"""

# ==================== 静态配置（永远存在） ====================

# 这些配置永远存在，不依赖外部文件
STATIC_FORMAT_CONFIG = {
    # 基础格式化配置
    "default_precision": 2,
    "default_date_format": "%Y-%m-%d",
    "default_time_format": "%H:%M:%S",
    
    # 显示配置
    "show_percentage": True,
    "show_count": True,
    "show_total": True,
    
    # 图表配置
    "default_chart_type": "bar",
    "default_chart_colors": ["#36A2EB", "#FF6384", "#4BC0C0", "#FFCE56", "#4BC0C0"],
    
    # 性能配置
    "enable_cache": True,
    "cache_ttl": 300,  # 5分钟
    "max_records_per_batch": 1000,
}

# ==================== 动态配置（可选，可以没有） ====================

# 这些配置是可选的，如果文件不存在或读取失败，使用静态配置
DYNAMIC_FORMAT_CONFIG = {
    # 高级格式化配置
    "advanced_formatting": {
        "enable_smart_rounding": True,
        "enable_scientific_notation": False,
        "max_decimal_places": 4,
    },
    
    # 自定义显示规则
    "display_rules": {
        "percentage_threshold": 0.1,  # 小于0.1%显示为"<0.1%"
        "zero_display": "0",  # 零值显示方式
        "null_display": "-",  # 空值显示方式
    },
    
    # 主题配置
    "themes": {
        "default": {
            "primary_color": "#007bff",
            "secondary_color": "#6c757d",
            "success_color": "#28a745",
            "warning_color": "#ffc107",
            "danger_color": "#dc3545",
        },
        "dark": {
            "primary_color": "#17a2b8",
            "secondary_color": "#6c757d",
            "success_color": "#28a745",
            "warning_color": "#ffc107",
            "danger_color": "#dc3545",
        }
    },
    
    # 国际化配置
    "i18n": {
        "default_locale": "zh_CN",
        "number_format": {
            "decimal_separator": ".",
            "thousands_separator": ",",
            "currency_symbol": "¥"
        },
        "date_format": {
            "short": "%m/%d",
            "medium": "%Y-%m-%d",
            "long": "%Y年%m月%d日"
        }
    }
}

# ==================== 配置加载策略 ====================

class FormatConfigLoader:
    """
    格式化配置加载器 - 演示动态配置不强制的设计
    """
    
    def __init__(self):
        self.static_config = STATIC_FORMAT_CONFIG.copy()
        self.dynamic_config = {}
        self.runtime_config = {}
    
    def load_dynamic_config(self, config_file_path: str = None) -> bool:
        """
        加载动态配置 - 可选操作
        
        Args:
            config_file_path: 配置文件路径，如果为None则尝试默认路径
            
        Returns:
            bool: 是否成功加载动态配置
        """
        try:
            if config_file_path is None:
                config_file_path = "config/analysis_format.json"
            
            # 尝试读取配置文件
            import json
            import os
            
            if os.path.exists(config_file_path):
                with open(config_file_path, 'r', encoding='utf-8') as f:
                    self.dynamic_config = json.load(f)
                print(f"✅ 成功加载动态配置: {config_file_path}")
                return True
            else:
                print(f"⚠️ 动态配置文件不存在: {config_file_path}，使用静态配置")
                return False
                
        except Exception as e:
            print(f"❌ 加载动态配置失败: {e}，使用静态配置")
            return False
    
    def get_config(self, key: str, default=None):
        """
        获取配置值 - 按优先级返回
        
        优先级：运行时配置 > 动态配置 > 静态配置 > 默认值
        """
        # 1. 检查运行时配置
        if key in self.runtime_config:
            return self.runtime_config[key]
        
        # 2. 检查动态配置
        if key in self.dynamic_config:
            return self.dynamic_config[key]
        
        # 3. 检查静态配置
        if key in self.static_config:
            return self.static_config[key]
        
        # 4. 返回默认值
        return default
    
    def set_runtime_config(self, key: str, value):
        """设置运行时配置"""
        self.runtime_config[key] = value
    
    def get_effective_config(self) -> dict:
        """获取有效配置（合并所有配置）"""
        effective_config = self.static_config.copy()
        effective_config.update(self.dynamic_config)
        effective_config.update(self.runtime_config)
        return effective_config

# ==================== 使用示例 ====================

def demonstrate_config_loading():
    """
    演示配置加载的不同场景
    """
    print("=== 配置加载演示 ===")
    
    # 场景1：只有静态配置（最简单）
    print("\n1. 只有静态配置（最简单）：")
    loader1 = FormatConfigLoader()
    precision = loader1.get_config("default_precision")
    print(f"   默认精度: {precision}")
    print("   ✅ 系统正常工作，使用静态配置")
    
    # 场景2：有动态配置文件
    print("\n2. 有动态配置文件：")
    loader2 = FormatConfigLoader()
    success = loader2.load_dynamic_config("config/analysis_format.json")
    if success:
        theme = loader2.get_config("themes.default.primary_color")
        print(f"   主题颜色: {theme}")
        print("   ✅ 使用动态配置增强功能")
    else:
        print("   ⚠️ 动态配置加载失败，但系统仍正常工作")
    
    # 场景3：运行时覆盖配置
    print("\n3. 运行时覆盖配置：")
    loader3 = FormatConfigLoader()
    loader3.set_runtime_config("default_precision", 3)  # 临时改为3位小数
    precision = loader3.get_config("default_precision")
    print(f"   运行时精度: {precision}")
    print("   ✅ 运行时配置优先级最高")
    
    # 场景4：配置不存在时的兜底
    print("\n4. 配置不存在时的兜底：")
    loader4 = FormatConfigLoader()
    unknown_config = loader4.get_config("unknown_config", "默认值")
    print(f"   未知配置: {unknown_config}")
    print("   ✅ 提供合理的默认值")

def demonstrate_why_optional_dynamic_config():
    """
    演示为什么动态配置是可选的
    """
    print("\n=== 为什么动态配置是可选的？ ===")
    
    print("🎯 设计原因：")
    print()
    
    print("1. 降低系统复杂度：")
    print("   - 不需要强制创建配置文件")
    print("   - 系统开箱即用，无需额外配置")
    print("   - 减少配置错误的可能性")
    print()
    
    print("2. 提高系统稳定性：")
    print("   - 配置文件损坏不会影响系统运行")
    print("   - 配置加载失败有兜底机制")
    print("   - 系统始终能正常工作")
    print()
    
    print("3. 支持渐进式配置：")
    print("   - 开始时使用默认配置")
    print("   - 需要时再添加自定义配置")
    print("   - 可以逐步完善配置")
    print()
    
    print("4. 适应不同部署环境：")
    print("   - 开发环境：使用默认配置")
    print("   - 测试环境：使用简单配置")
    print("   - 生产环境：使用完整配置")
    print()
    
    print("5. 便于维护和升级：")
    print("   - 配置变更不影响核心功能")
    print("   - 可以安全地删除配置文件")
    print("   - 系统升级时配置兼容性好")

if __name__ == "__main__":
    demonstrate_config_loading()
    demonstrate_why_optional_dynamic_config()
    
    print("\n🎉 动态配置不强制的好处：")
    print("   ✅ 系统简单可靠")
    print("   ✅ 开箱即用")
    print("   ✅ 渐进式配置")
    print("   ✅ 高容错性")
    print("   ✅ 易于维护") 